class Empreendimento < ActiveRecord::Base

  # Associations
  belongs_to :pleito
  validates_presence_of :pleito
  attr_readonly :pleito_id

  with_options :dependent => :destroy do |e|
    e.has_many :pessoas_juridicas
    e.has_many :componentes_empreendimento
    e.has_many :acionistas
    e.has_many :beneficios
    e.has_many :ano_calendarios
  end

  with_options :class_name => 'RepresentanteLegal' do |e|
    e.has_one :represenante_legais
  end
  
  with_options :class_name => 'PessoaJuridica' do |e|
    e.has_one :pj_objeto,  :conditions => {:objeto => true}
    e.has_one :pj_titular, :conditions => {:objeto => false}
  end
  accepts_nested_attributes_for :pj_objeto
  accepts_nested_attributes_for :pj_titular, :allow_destroy => true

  with_options :class_name => 'ComponenteEmpreendimento' do |e|
    e.has_many :gerentes,     :conditions => {:conselho => false}
    e.has_many :conselheiros, :conditions => {:conselho => true}
  end

  belongs_to :receita_municipio, :class_name => 'Municipio', :readonly => true

  # Validations
  attr_accessor :skip_validation
  attr_protected :skip_validation

  #validates_presence_of :representante_nome, :representante_cpf, :representante_cargo
  #validates_cpf_of       :representante_cpf
  with_options :unless => :skip_validation, :on => :update do |e|
    e.validates_presence_of :objetivos_sociais, :encerramento_exercicio_social, :empregos_diretos,
                            :capital_social_valor, :capital_social_atualizacao
    e.validates_presence_of :receita_municipio, :receita_unidade, :receita_logradouro, :receita_numero,
                            :receita_bairro, :receita_cep, :unless => Proc.new { |e| e.skip_validation || e.pleito.isencao? }
    e.validates_numericality_of :capital_social_valor, :greater_than => 0, :allow_nil => true
    e.validates_numericality_of :empregos_diretos, :empregos_terceirizados, :allow_nil => true, :only_integer => true
  end
  
  def representante_cpf=(value)
      self[:representante_cpf] = value.gsub(/\D/, "")
  end
  
  before_validation_on_update :verificar_representante

  def verificar_representante
    erro = false
    if representante_nome.nil?
      errors.add_to_base "Nome do Representante deve ser preenchido(a)."
      erro = true
    end
    if representante_cpf.nil?
      errors.add_to_base "CPF do Representante deve ser preenchido(a)."
      erro = true
    else
      if !cpf_valid?(representante_cpf)
        errors.add_to_base "CPF do Representante é inválido(a)."
        erro = true
      end
    end
    if representante_cargo.nil?
      errors.add_to_base "Cargo do Representante deve ser preenchido(a)."
      erro = true
    end
    return !erro
  end

  # TODO DRY (acts_as_cep)
  def receita_cep=(value)
    self[:receita_cep] = value.gsub(/\D/, "")
  end
  
  # TODO DRY (acts_as_cep)
  def receita_endereco
    "#{receita_logradouro}, n° #{receita_numero}, #{receita_bairro}, CEP #{receita_cep[0,5]}-#{receita_cep[5,3]}"
  end

  # Helpers

  # verifica se todos os dados requeridos estão devidamente preenchidos
  def ok?
    temp = pj_ok? && acionistas_ok? && gerentes_ok? && edit_ok?
    if(pleito.incentivo.id == 201663980)
      temp = ano_calendarios_ok?
    end
    temp
  end

  def pj_ok?
    pessoas_juridicas.any?
  end

  def acionistas_ok?
    acionistas.any?
  end
  
  def beneficios_ok?
    beneficios.any?
  end
  
  def ano_calendarios_ok?
    ano_calendarios.any?
  end

  def gerentes_ok?
    gerentes.any?
  end

  # ok se pelo menos um dos campos obrigatorios ja foi preenchido
  def edit_ok?
    !objetivos_sociais.nil?
  end

  def pessoa_juridica
    pj_titular || pj_objeto
  end

  def formatted_receita_cep
    "#{receita_cep[0,5]}-#{receita_cep[5,3]}"
  end

  def nome_cnpj
    rotulo = ""
    if(!pj_titular.nil? || !pj_objeto.nil?)
      if !pessoa_juridica.razao_social.empty?
        rotulo = " - " + pessoa_juridica.razao_social
      end
      if !pessoa_juridica.cnpj.empty?
        rotulo += " - " + pessoa_juridica.formatted_cnpj
      end
    end
    return rotulo
  end
  
  def parse(string)
    string.gsub(/\D/, "").split(//).map(&:to_i) if string
  end
  
  def array_sum(array, multiplier, index, steps)
    return 0 if steps <= 0
    multiplier * array[index] + array_sum(array, multiplier-1, index+1, steps-1)
  end

  def cpf_valid?(cpf)
    values = parse(cpf)
    return false unless values
    return false unless values.length == 11
    return false if values.uniq.length == 1
    v1 = array_sum(values, 10, 0, 9)
    v1 = 11 - (v1 % 11)
    v1 = 0 if v1 >= 10
    return false if v1 != values[-2]
    v2 = array_sum(values, 11, 0, 9)
    v2 += 2 * v1
    v2 = 11 - (v2 % 11)
    v2 = 0 if v2 >= 10
    v2 == values[-1]
  end
  
end
